package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;

import educar.db.DbConnection;
import educar.db.JPA;

public class Actividad
{
    private static JPA jpa = new JPA();
    private static final String noAsignado = "-1";
    private String descripcion;
    private Materia materia;
    private String codigoActividad;

    public String toString()
    {
    	return descripcion +  " - " + codigoActividad;
    }
    
    public Actividad(String des, Materia m)
    {
        descripcion = des;
        materia = m;
        codigoActividad = noAsignado;
    }

    public Actividad(String des, String codMateria) throws materiaNotFound
    {
        descripcion = des;
        materia = Materia.getMateriabyCodigo(codMateria);
        codigoActividad = noAsignado;
    }

    private Actividad(String codActividad, String des, String codMateria)
    {
        descripcion = des;
        try
        {
            materia = Materia.getMateriabyCodigo(codMateria);
        }
        catch (materiaNotFound e)
        {
            e.printStackTrace();
        }
        codigoActividad = codActividad;
    }

    public boolean save()
    {
        String[] columns = { "codigoActividad", "descripcionActividad", "codigoMat" };
        PreparedStatement stm = jpa.newRecord(DbConnection.bd+".actividad", columns);
        try
        {
            stm.setString(1, null);
            stm.setString(2, descripcion);
            stm.setString(3, materia.getCodigo());
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return false;
        }

        jpa.create(stm);
        actualizarCodigoAlMaximo();

        return true;
    }

    //para utilizar al guardar un cargo en la base de datos
    //y obtener el codigo que le fue asignado en el objeto
    //utilizar sólo inmediatamente despues de guardar en la base de datos
    private void actualizarCodigoAlMaximo()
    {
        ResultSet rs = jpa.showMaxColumn("actividad", "codigoActividad");
        try
        {
            if (rs.next())
            {
                this.codigoActividad = rs.getString(1);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void destroy() throws actividadNotFound
    {
        if (codigoActividad.compareTo(noAsignado) != 0)
            jpa.destroy("actividad", "codigoActividad", codigoActividad);
        else
            throw new actividadNotFound();
    }

    public void update() throws actividadNotFound
    {
        if (codigoActividad.compareTo(noAsignado) != 0)
            jpa.update("actividad", "descripcionActividad", descripcion, "codigoActividad", codigoActividad);
        else
            throw new actividadNotFound();
    }

    public static Actividad getbyCodigo(String codigo) throws actividadNotFound
    {
        ResultSet rs = null;
        Actividad a = null;

        rs = jpa.getByField("actividad", "codigoActividad", codigo);

        try
        {
            if (rs.next())
            {
                a = new Actividad(rs.getString(1), rs.getString(2), rs.getString(3));
            }
            else
            {
                throw new actividadNotFound();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return a;
    }

    public static LinkedList<Actividad> getAllByMateria(Materia m)
    {
        return getAllByMateria(m.getCodigo());
    }

    public static LinkedList<Actividad> getAllByMateria(String codMateria)
    {
        ResultSet rs = null;
        LinkedList<Actividad> actividades = new LinkedList<Actividad>();

        rs = jpa.getByField("actividad", "codigoMat", codMateria);

        try
        {
            while (rs.next())
            {
                actividades.add(new Actividad(rs.getString(1), rs.getString(2), rs.getString(3)));
            }

        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return actividades;
    }

    public static String[] getAllByMateriasArray(String codMateria)
    {
        LinkedList<Actividad> l = getAllByMateria(codMateria);
        String[] actividades = new String[l.size()];
        for (int i = 0; i < l.size(); i++)
            actividades[i] = l.get(i).toString();

        return actividades;
    }

    public String getCodigoActividad()
    {
        return codigoActividad;
    }

    public Materia getMateria()
    {
        return materia;
    }

    public void setMateria(String codMateria) throws materiaNotFound
    {
        materia = Materia.getMateriabyCodigo(codMateria);
    }

    public void setMateria(Materia m)
    {
        materia = m;
    }

    public String getDescripcion()
    {
        return descripcion;
    }
}